/*
    Copyright 2024, Haiku, Inc. All Rights Reserved.
    Distributed under the terms of the MIT License.

    龙芯7A2000 GPU驱动宏定义
*/

#ifndef MACROS_H
#define MACROS_H

/* 寄存器访问宏 */
#define INREG8(addr) (*((volatile uint8 *)(addr)))
#define INREG16(addr) (*((volatile uint16 *)(addr)))
#define INREG32(addr) (*((volatile uint32 *)(addr)))

#define OUTREG8(addr, val) (*((volatile uint8 *)(addr)) = (val))
#define OUTREG16(addr, val) (*((volatile uint16 *)(addr)) = (val))
#define OUTREG32(addr, val) (*((volatile uint32 *)(addr)) = (val))

/* 位操作宏 */
#define SETBITS(v, b) ((v) |= (b))
#define CLEARBITS(v, b) ((v) &= ~(b))
#define TOGGLEBITS(v, b) ((v) ^= (b))

/* 内存对齐宏 */
#define ROUNDUP(val, round) (((val) + ((round) - 1)) & ~((round) - 1))

/* 龙芯7A2000 GPU寄存器定义 */
#define LS7A_GPU_BASE 0x0E000000 /* GPU寄存器基地址 */

/* 显示控制器寄存器 */
#define LS7A_DC_BASE (LS7A_GPU_BASE + 0x00100000) /* 显示控制器基地址 */
#define LS7A_DC_FB_ADDR 0x00                      /* 帧缓冲地址寄存器 */
#define LS7A_DC_FB_STRIDE 0x08                    /* 帧缓冲行跨度寄存器 */
#define LS7A_DC_FB_ORIGIN 0x10                    /* 帧缓冲原点寄存器 */
#define LS7A_DC_HDISPLAY 0x18                     /* 水平显示寄存器 */
#define LS7A_DC_HSYNC 0x20                        /* 水平同步寄存器 */
#define LS7A_DC_VDISPLAY 0x28                     /* 垂直显示寄存器 */
#define LS7A_DC_VSYNC 0x30                        /* 垂直同步寄存器 */
#define LS7A_DC_CTRL 0x38                         /* 控制寄存器 */

/* 控制寄存器位定义 */
#define LS7A_DC_CTRL_ENABLE 0x00000001    /* 显示控制器使能 */
#define LS7A_DC_CTRL_RESET 0x00000002     /* 显示控制器复位 */
#define LS7A_DC_CTRL_HSYNC_POL 0x00000004 /* 水平同步极性 */
#define LS7A_DC_CTRL_VSYNC_POL 0x00000008 /* 垂直同步极性 */

/* 像素格式定义 */
#define LS7A_PIX_FMT_MASK 0x00000070  /* 像素格式掩码 */
#define LS7A_PIX_FMT_8BPP 0x00000000  /* 8位每像素 */
#define LS7A_PIX_FMT_16BPP 0x00000010 /* 16位每像素 */
#define LS7A_PIX_FMT_24BPP 0x00000020 /* 24位每像素 */
#define LS7A_PIX_FMT_32BPP 0x00000030 /* 32位每像素 */

/* 中断控制寄存器 */
#define LS7A_INT_BASE (LS7A_GPU_BASE + 0x00200000) /* 中断控制器基地址 */
#define LS7A_INT_ENABLE 0x00                       /* 中断使能寄存器 */
#define LS7A_INT_STATUS 0x08                       /* 中断状态寄存器 */
#define LS7A_INT_CLEAR 0x10                        /* 中断清除寄存器 */

/* 中断位定义 */
#define LS7A_INT_VSYNC 0x00000001         /* 垂直同步中断 */
#define LS7A_INT_FIFO_UNDERRUN 0x00000002 /* FIFO下溢中断 */

/* 2D加速引擎寄存器 */
#define LS7A_2D_BASE (LS7A_GPU_BASE + 0x00300000) /* 2D加速引擎基地址 */
#define LS7A_2D_CTRL 0x00                         /* 控制寄存器 */
#define LS7A_2D_SRC_ADDR 0x08                     /* 源地址寄存器 */
#define LS7A_2D_SRC_STRIDE 0x10                   /* 源行跨度寄存器 */
#define LS7A_2D_SRC_XY 0x18                       /* 源坐标寄存器 */
#define LS7A_2D_DST_ADDR 0x20                     /* 目标地址寄存器 */
#define LS7A_2D_DST_STRIDE 0x28                   /* 目标行跨度寄存器 */
#define LS7A_2D_DST_XY 0x30                       /* 目标坐标寄存器 */
#define LS7A_2D_SIZE 0x38                         /* 大小寄存器 */
#define LS7A_2D_PATTERN 0x40                      /* 模式寄存器 */
#define LS7A_2D_FGCOLOR 0x48                      /* 前景色寄存器 */
#define LS7A_2D_BGCOLOR 0x50                      /* 背景色寄存器 */
#define LS7A_2D_CLIPRECT_MIN 0x58                 /* 裁剪矩形最小坐标寄存器 */
#define LS7A_2D_CLIPRECT_MAX 0x60                 /* 裁剪矩形最大坐标寄存器 */
#define LS7A_2D_STATUS 0x68                       /* 状态寄存器 */

/* 2D控制寄存器位定义 */
#define LS7A_2D_CTRL_START 0x00000001 /* 启动操作 */
#define LS7A_2D_CTRL_BUSY 0x00000002  /* 引擎忙 */

/* 2D操作码定义 */
#define LS7A_2D_OP_MASK 0x0000001C    /* 操作码掩码 */
#define LS7A_2D_OP_COPY 0x00000000    /* 复制操作 */
#define LS7A_2D_OP_FILL 0x00000004    /* 填充操作 */
#define LS7A_2D_OP_BLEND 0x00000008   /* 混合操作 */
#define LS7A_2D_OP_PATTERN 0x0000000C /* 模式填充操作 */

/* 光标控制寄存器 */
#define LS7A_CURSOR_BASE (LS7A_GPU_BASE + 0x00400000) /* 光标控制器基地址 */
#define LS7A_CURSOR_ADDR 0x00                         /* 光标图像地址寄存器 */
#define LS7A_CURSOR_POS 0x08                          /* 光标位置寄存器 */
#define LS7A_CURSOR_CTRL 0x10                         /* 光标控制寄存器 */
#define LS7A_CURSOR_FG 0x18                           /* 光标前景色寄存器 */
#define LS7A_CURSOR_BG 0x20                           /* 光标背景色寄存器 */

/* 光标控制寄存器位定义 */
#define LS7A_CURSOR_CTRL_ENABLE 0x00000001 /* 光标使能 */
#define LS7A_CURSOR_CTRL_ALPHA 0x00000002  /* 光标Alpha混合使能 */

#endif /* MACROS_H */